#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Kontrolcu-Tk
#  - Kontrolcu icin Tk arayüzü
#
# Geliştiriciler:
#  - Osman KARAGÖZ <osmank3@gmail.com>
#  - Taha Doğan Güneş <tdgunes@gmail.com>
# Belgelendirici:
#  - Okan Okuroğulları <ookurogullari@gmail.com>
#
# Web Sitesi: http://code.google.com/p/kontrolcu
# Lisansı: GPL v3 ile lisanslanmıştır.
#
# Yardım dökümanlarını http://code.google.com/p/kontrolcu/w/list 
#                                     adresinden bulabilirsiniz.


import sys, hashlib

try:
  import libkontrolcu
except:
  print "libkontrolcu modülü bulunamadı"
  exit()

try:
  from Tkinter import *
  from tkFileDialog import *
  from tkMessageBox import *
except:
  print "python-tk kurulu değil. Lütfen paket yöneticinizle kurun."
  exit()

ana=Tk()
ana.title("Kontrolcu-tk")

try:
  import ImageTk
  def simge():
    icon = ImageTk.PhotoImage(file="/usr/share/icons/kont-tk.png")
    ana.tk.call('wm', 'iconphoto', ana._w, icon)
  simge()
except:
  print "ImageTk kurulu değil. Lütfen paket yöneticinizle kurun."
  pass

KontTipler=("md5","sha1")
dosliste=[]

def KonTopSec(x):
  global KonTip
  if x == "md5":
    KonTip=hashlib.md5
  elif x == "sha1":
    KonTip=hashlib.sha1

def DosyaSec(event=None):
  global a
  a=askopenfilename()
  if a == "":
    del a
  else:
    E.delete(0, END)
    E.insert(0, a)

def Ekle(event=None):
  global dosliste
  if E.get() == "":
    showwarning("Hata", "Lütfen dosya seçin")
  elif E.get() != "":
    L.insert(END, E.get())
    dosliste.append(E.get())

def Cikar(event=None):
  global dosliste
  try:
    dosliste.pop(int(L.index(ACTIVE)))
    L.delete(ACTIVE)
  except IndexError:
    showinfo("Bilgi","Liste boş")

def Pano(event=None):
  ana.clipboard_clear()
  ana.clipboard_get(dosliste[L.get(ACTIVE)])
  ana.withdraw()

def KontrolEt(event=None):
  try:
    if len(dosliste) == 0:
      showwarning("Hata","Listeye dosya ekleyin")
    else:
      libkontrolcu.veri = []
      libkontrolcu.anamotor(KonTip, dosliste, 1)
      L.delete(0, END)
      for i in libkontrolcu.veri:
        L.insert(END, str(i))
  except NameError:
    showwarning("Hata","Kontrol tipini seçin")

def Kaydet(event=None):
  kayit=asksaveasfilename()
  if kayit == "" or kayit == ():
    del kayit
  else:
    try:
      kdosya=open(kayit, 'w')
      i=0
      while len(libkontrolcu.veri)>i:
        kdosya.write(L.get(i)+"\n")
        i += 1
      kdosya.close()
    except IOError, (hata_no, hata):
      if hata_no == 13:
        showerror("Dosya Kaydedilemedi!","Kayıt yerine yazma izniniz olmayabilir!")

def Temizle(event=None):
  global dosliste
  dosliste=[]
  E.delete(0, END)
  L.delete(0, END)

def KontrolDosyasi(event=None):
  def DSdef():
    b=askopenfilename()
    if b == "":
      del b
    else:
      KDS.delete(0, END)
      KDS.insert(0, b)

  def DSYdef():
    c=askdirectory()
    if c == "":
      del c
    else:
      KDYS.delete(0, END)
      KDYS.insert(0, c)

  def Kdef():
    if KDS.get() == "":
      showwarning("Hata","Dosya seçin ya da internet adresi girin")
    elif KDYS.get() == "":
      showwarning("Hata","Kontrol dizinini seçin")
    else:
      dosya=[]
      dosya.insert(0, KDS.get())
      dosya.insert(1, KDYS.get())
      libkontrolcu.check(dosya)
      yazi=""
      if len(libkontrolcu.veri) >= 1:
        for i in range(len(libkontrolcu.veri)):
          yazi=yazi + libkontrolcu.veri[i-1] + "\n"
        showinfo("Sonuç", yazi)
      elif len(libkontrolcu.hataveri) >= 1:
        showerror("Hata", libkontrolcu.hataveri[0])
        KTdef()

  def KTdef():
    dosya=[]
    libkontrolcu.veri=[]
    libkontrolcu.hataveri=[]
    KDS.delete(0, END)
    KDYS.delete(0, END)

  #dosyadan kontrol arayüzü
  dKont=Tk()

  global KDS, KDYS
  dKont.title("Dosyadan Kontrol")
  Label(dKont, text="Dosya Adresi:").grid(row=0, column=0)
  KDS=Entry(dKont, bg="#FFFFFF", width=45);KDS.grid(row=0, column=1)
  Label(dKont, text="Kontrol Dizini:").grid(row=1, column=0)
  KDYS=Entry(dKont, bg="#FFFFFF", width=45);KDYS.grid(row=1, column=1)
  KDSB=Button(dKont, text="Dosya Seç", command=DSdef).grid(row=0, column=2)
  KDYSB=Button(dKont, text="Dizin Seç", command=DSYdef).grid(row=1, column=2)
  Button(dKont, text="Kontrol Et", command=Kdef).grid(row=2, column=2)
  Button(dKont, text="Temizle", command=KTdef).grid(row=2, column=1) 

  dKont.mainloop()


def Saglama(event=None):
  def DSdef():
    b=askopenfilename()
    if b == "":
      del b
    else:
      DS.delete(0, END)
      DS.insert(0, b)

  def Kdef():
    if DS.get() == "":
      showwarning("Hata","Dosya seçin")
    elif KY.get() == "":
      showwarning("Hata","Kontrol toplamını yazın")
    else:
      dosya=[]
      dosya.insert(0, DS.get())
      dosya.insert(1, KY.get())
      libkontrolcu.ccheck(dosya)
      if len(libkontrolcu.veri) >= 1:
        showinfo("Sonuç", libkontrolcu.veri[0])
      elif len(libkontrolcu.hataveri) >= 1:
        showerror("hata", libkontrolcu.hataveri[0])
        STdef()

  def STdef():
    dosya=[]
    libkontrolcu.veri=[]
    libkontrolcu.hataveri=[]
    DS.delete(0, END)
    KY.delete(0, END)

  #sağlama arayüzü
  saglama=Tk()

  global DS, KY
  saglama.title("Sağlama")
  Label(saglama, text="Dosya Adresi:").grid(row=0, column=0)
  DS=Entry(saglama, bg="#FFFFFF", width=45);DS.grid(row=0, column=1)
  Label(saglama, text="Kontrol Toplamı:").grid(row=1, column=0)
  KY=Entry(saglama, bg="#FFFFFF", width=45);KY.grid(row=1, column=1)
  DSB=Button(saglama, text="Dosya Seç", command=DSdef).grid(row=0, column=2)
  KB=Button(saglama, text="Kontrol Et", command=Kdef).grid(row=1, column=2)
  Button(saglama, text="Temizle", command=STdef).grid(row=2, column=1)

  saglama.mainloop()


def yardim():
  showinfo("Yardım", 'Kontrolcu hakkında detaylı bilgiyi\n"code.google.com/p/kontrolcu"  adresinden bulabilirsiniz.')

def hakkinda():
  showinfo("Hakkında", 'Kontrolcu-Tk\nKontrolcu için Tkinter arayüzü\n\nGeliştiriciler\n- Taha Doğan Güneş <tdgunes@gmail.com>\n- Osman Karagöz <osmank3@gmail.com>\n\nBelgelendirici\n- Okan Okuroğulları <ookurogullari@gmail.com>\n\nWeb Sitesi: code.google.com/p/kontrolcu\n\nLisans: GPL v3 ile lisanslanmıştır.')

#arayüz

FA=Frame(relief=RAISED)

FA1=Frame(FA, relief=RAISED, borderwidth=0)
for d in KontTipler:
  Radiobutton(FA1, text="%s kontrol"% d, value=d, command=(lambda d=d: KonTopSec(d))).pack(anchor=NW, pady=4)
FA1.pack(anchor=N, fill=BOTH)

FA2=Frame(FA, relief=RAISED)
K=Button(FA2, text="Kontrol et")
K.config(command=KontrolEt)
K.pack(pady=3)
S=Button(FA2, text="Kaydet")
S.config(command=Kaydet)
S.pack(pady=3)
T=Button(FA2, text="Temizle")
T.config(command=Temizle)
T.pack(pady=3)
FA2.pack(side=BOTTOM, padx=8)

FA.pack(side=LEFT, fill=Y, pady=8)

FB=Frame(relief=RAISED)

FB1=Frame(FB, relief=RAISED)
FB1A=Frame(FB1)
D=Button(FB1A, text="Dosya seç")
D.config(command=DosyaSec)
D.pack(side=RIGHT)
E=Entry(FB1A, relief=RAISED, bg="#FFFFFF")
E.pack(fill=X, anchor=NW, padx=4, pady=4)
FB1A.pack(side=TOP, fill=X)

FB1B=Frame(FB1)
EB=Button(FB1B, text="Ekle", command=Ekle)
EB.pack(side=RIGHT, pady=2, padx=20)
CB=Button(FB1B, text="Çıkar", command=Cikar)
CB.pack(side=LEFT, pady=2, padx=20)
FB1B.pack(anchor=CENTER)
FB1.pack(side=TOP, fill=X)

FB2=Frame(FB, relief=RAISED)
L=Listbox(FB2, width=50, height=8, bg="#FFFFFF")
sbar=Scrollbar(FB, command=L.yview)
L.config(yscrollcommand=sbar.set)
L.pack()
sbar.pack(side=RIGHT, fill=Y)
FB2.pack(side=BOTTOM)

FB.pack(side=RIGHT, padx=2, pady=2)

#Menüler

top=Menu(ana)
ana.config(menu=top)
dosya=Menu(top)
dosya.add_command(label="Yeni Kontrol", underline=0, command=Temizle)
dosya.add_command(label="Kontrolu Kaydet", underline=9, command=Kaydet)
dosya.add_separator()
dosya.add_command(label="Dosyadan Kontrol", underline=0, command=KontrolDosyasi)
dosya.add_command(label="Sağlama", underline=0, command=Saglama)
dosya.add_separator()
dosya.add_command(label="Çıkış", underline=0, command=exit)
top.add_cascade(label="Dosya", underline=0, menu=dosya)

yardimmenu=Menu(ana)
yardimmenu.add_command(label="Yardım Başlıkları", underline=0, command=yardim)
yardimmenu.add_command(label="Hakkında", underline=0, command=hakkinda)
top.add_cascade(label="Yardım", underline=0, menu=yardimmenu)

#Kısayollar

ana.bind("<Control-s>", Kaydet)
ana.bind("<Control-n>", Temizle)
ana.bind("<Control-d>", DosyaSec)
ana.bind("<Control-c>", KontrolEt)
ana.bind("<Control-o>", KontrolDosyasi)
ana.bind("<Control-a>", Saglama)
ana.bind("<Control-e>", Ekle)
ana.bind("<Control-r>", Cikar)
ana.bind("Double-Button-1", Pano)
ana.bind("<Escape>", exit)

ana.mainloop()
